# RUN: llc -mtriple=aarch64-apple-ios -run-pass=early-tailduplication %s -o - | FileCheck %s

--- |
  ; ModuleID = 'taildup.ll'
  source_filename = "taildup.ll"
  target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
  target triple = "aarch64-apple-ios"
  
  @bb1 = global i8* blockaddress(@foo, %final)
  @bb2 = global i8* inttoptr (i32 1 to i8*)
  
  define void @foo(i1 %tst, i32* %ptr) {
    br i1 %tst, label %left, label %right
  
  left:                                             ; preds = %0
    %val.left = call i32 @bar()
    br label %next
  
  right:                                            ; preds = %0
    %val.right = call i32 @baz()
    br label %next
  
  next:                                             ; preds = %right, %left
    %val = phi i32 [ %val.left, %left ], [ %val.right, %right ]
    store i32 %val, i32* %ptr, align 4
    br label %final
  
  final:                                            ; preds = %next
    %1 = call i32 @bar()
    ret void
  }
  
  declare i32 @bar()
  
  declare i32 @baz()

...
---
name:            foo
alignment:       4
exposesReturnsTwice: false
legalized:       false
regBankSelected: false
selected:        false
failedISel:      false
tracksRegLiveness: true
hasWinCFI:       false
registers:
  - { id: 0, class: gpr32all, preferred-register: '' }
  - { id: 1, class: gpr32all, preferred-register: '' }
  - { id: 2, class: gpr32, preferred-register: '' }
  - { id: 3, class: gpr32, preferred-register: '' }
  - { id: 4, class: gpr64common, preferred-register: '' }
  - { id: 5, class: gpr32all, preferred-register: '' }
  - { id: 6, class: gpr32all, preferred-register: '' }
  - { id: 7, class: gpr32all, preferred-register: '' }
liveins:
  - { reg: '$w0', virtual-reg: '%3' }
  - { reg: '$x1', virtual-reg: '%4' }
frameInfo:
  isFrameAddressTaken: false
  isReturnAddressTaken: false
  hasStackMap:     false
  hasPatchPoint:   false
  stackSize:       0
  offsetAdjustment: 0
  maxAlignment:    1
  adjustsStack:    true
  hasCalls:        true
  stackProtector:  ''
  maxCallFrameSize: 0
  cvBytesOfCalleeSavedRegisters: 0
  hasOpaqueSPAdjustment: false
  hasVAStart:      false
  hasMustTailInVarArgFunc: false
  hasTailCall:     false
  localFrameSize:  0
  savePoint:       ''
  restorePoint:    ''
fixedStack:      []
stack:           []
callSites:       []
debugValueSubstitutions: []
constants:       []
machineFunctionInfo: {}
body:             |
  bb.0 (%ir-block.0):
    successors: %bb.1(0x40000000), %bb.2(0x40000000)
    liveins: $w0, $x1

    %4:gpr64common = COPY $x1
    %3:gpr32 = COPY $w0
    TBZW %3, 0, %bb.2
    B %bb.1

  bb.1.left:
    successors: %bb.3(0x80000000)

    ADJCALLSTACKDOWN 0, 0, implicit-def dead $sp, implicit $sp
    BL @bar, csr_darwin_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp, implicit-def $w0
    ADJCALLSTACKUP 0, 0, implicit-def dead $sp, implicit $sp
    %6:gpr32all = COPY $w0
    %0:gpr32all = COPY %6
    B %bb.3

  bb.2.right:
    successors: %bb.3(0x80000000)

    ADJCALLSTACKDOWN 0, 0, implicit-def dead $sp, implicit $sp
    BL @baz, csr_darwin_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp, implicit-def $w0
    ADJCALLSTACKUP 0, 0, implicit-def dead $sp, implicit $sp
    %5:gpr32all = COPY $w0
    %1:gpr32all = COPY %5

  bb.3.next:
    successors: %bb.4(0x80000000)

    ; CHECK: %2:gpr32 = PHI
    %2:gpr32 = PHI %1, %bb.2, %0, %bb.1
    STRWui %2, %4, 0 :: (store (s32) into %ir.ptr)

  bb.4.final (ir-block-address-taken %ir-block.final):
    ADJCALLSTACKDOWN 0, 0, implicit-def dead $sp, implicit $sp
    BL @bar, csr_darwin_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp, implicit-def $w0
    ADJCALLSTACKUP 0, 0, implicit-def dead $sp, implicit $sp
    %7:gpr32all = COPY $w0
    RET_ReallyLR

...
